﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace In_Game
{
    class Heroi
    {
        KeyboardState teclado;

        //Animacoes do heroi
        List<Animacao> animacoesHeroi = new List<Animacao>();

        Animacao animacaoHeroiParadoBaixo;
        Animacao animacaoHeroiAndandoBaixo;
        Animacao animacaoHeroiAtirandoBaixo;
        public Animacao animacaoHeroiDanoBaixo;

        Animacao animacaoHeroiParadoCima;
        Animacao animacaoHeroiAndandoCima;
        Animacao animacaoHeroiAtirandoCima;
        public Animacao animacaoHeroiDanoCima;

        Animacao animacaoHeroiParadoDireita;
        Animacao animacaoHeroiAndandoDireita;
        Animacao animacaoHeroiAtirandoDireita;
        public Animacao animacaoHeroiDanoDireita;

        Animacao animacaoHeroiParadoEsquerda;
        Animacao animacaoHeroiAndandoEsquerda;
        Animacao animacaoHeroiAtirandoEsquerda;
        public Animacao animacaoHeroiDanoEsquerda;

        public EstadoHeroi estadoHeroi;
        GraphicsDevice graphicsDevice;
        public bool pause = false;
        public bool movimento = false;
        public bool mover = true;

        //Posicao do heroi
        public Vector2 posicao;

        Texture2D textura;

        //velocidade do heroi
        public int velocidadeHeroiX = 5;
        public int velocidadeHeroiY = 5;
        public int velocidadeHeroiXm = 5;
        public int velocidadeHeroiYm = 5;

        //Qual a posicao o heroi estará parado
        public bool cima = false, baixo = true, direita = false, esquerda = false;

        public bool atingido = false;
        public bool atirando = false;
        public bool atirar = true;

        public int vida = 3;
        public int HP = 100;

        public Rectangle retangulo;
        Point posicaoRetangulo;
        Point tamanhoRetangulo;

        // tiro
        public List<Tiro> tiros = new List<Tiro>();
        public Tiro tiro;
        public Texture2D texturaTiro;

        Vector2 posicaoTiro;
        
        float rotacao;
        float velocidadeTiroX;
        float velocidadeTiroY;
        //Rectangle retanguloTiro;

        // frequencia de tiros
        TimeSpan tempoTiro;
        TimeSpan ultimoTempoTiro;

        int jogador = 0;


        public List<Inimigo> listaInimigos;

        public Animacao mapa;

        public Heroi(GraphicsDevice graphicsDevice, Texture2D textura, Vector2 posicao, Tiro tiro, Texture2D texturaTiro, int jogador)
        {
            estadoHeroi = EstadoHeroi.PARADO_B;

            this.graphicsDevice = graphicsDevice;
            this.textura = textura;
            this.tiro = tiro;
            this.texturaTiro = texturaTiro;
            this.jogador = jogador;

            animacaoHeroiParadoBaixo = new Animacao(textura, posicao, new Point(236, 6), 59, 73, 1, 1, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiParadoBaixo);

            animacaoHeroiAndandoBaixo = new Animacao(textura, posicao, new Point(236, 6), 59, 73, 4, 12, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiAndandoBaixo);

            animacaoHeroiAtirandoBaixo = new Animacao(textura, posicao, new Point(190, 272), 59, 73, 3, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiAtirandoBaixo);

            animacaoHeroiDanoBaixo = new Animacao(textura, posicao, new Point(10, 625), 59, 73, 5, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiDanoBaixo);

            animacaoHeroiParadoCima = new Animacao(textura, posicao, new Point(0, 6), 59, 73, 1, 1, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiParadoCima);

            animacaoHeroiAndandoCima = new Animacao(textura, posicao, new Point(0, 6), 59, 73, 4, 12, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiAndandoCima);

            animacaoHeroiAtirandoCima = new Animacao(textura, posicao, new Point(2, 272), 59, 73, 3, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiAtirandoCima);

            animacaoHeroiDanoCima = new Animacao(textura, posicao, new Point(10, 712), 59, 73, 5, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiDanoCima);

            animacaoHeroiParadoDireita = new Animacao(textura, posicao, new Point(0, 179), 59, 73, 1, 1, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiParadoDireita);

            animacaoHeroiAndandoDireita = new Animacao(textura, posicao, new Point(123, 179), 59, 73, 5, 12, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiAndandoDireita);

            animacaoHeroiAtirandoDireita = new Animacao(textura, posicao, new Point(0, 360), 59, 73, 3, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiAtirandoDireita);

            animacaoHeroiDanoDireita = new Animacao(textura, posicao, new Point(10, 445), 59, 73, 5, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiDanoDireita);

            animacaoHeroiParadoEsquerda = new Animacao(textura, posicao, new Point(0, 88), 59, 73, 1, 1, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiParadoEsquerda);

            animacaoHeroiAndandoEsquerda = new Animacao(textura, posicao, new Point(62, 88), 59, 73, 6, 12, Color.White, 1, true, true);
            animacoesHeroi.Add(animacaoHeroiAndandoEsquerda);

            animacaoHeroiAtirandoEsquerda = new Animacao(textura, posicao, new Point(190, 360), 59, 73, 3, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiAtirandoEsquerda);

            animacaoHeroiDanoEsquerda = new Animacao(textura, posicao, new Point(10, 535), 59, 73, 5, 12, Color.White, 1, false, false);
            animacoesHeroi.Add(animacaoHeroiDanoEsquerda);

            tempoTiro = TimeSpan.FromSeconds(.3f);
        }

       
        
        public void Update(GameTime gameTime)
        {
            teclado = Keyboard.GetState();
            
            if (jogador == 1)
            {
                Controle(gameTime);
            }

            if (jogador == 2)
            {
                Controle2(gameTime);
            }
            UpdateTiros();
            RetanguloHeroi();

            for (int i = 0; i < animacoesHeroi.Count; i++)
            {
                animacoesHeroi[i].Update(gameTime);
                animacoesHeroi[i].posicao = posicao;
            }

            if (animacaoHeroiDanoBaixo.ativo == false && animacaoHeroiDanoCima.ativo == false && animacaoHeroiDanoDireita.ativo == false && animacaoHeroiDanoEsquerda.ativo == false)
            {
                atingido = false;
            }

            if (posicao.X <= 0)
            {
                posicao.X = 0;
            }

            if (posicao.X >= graphicsDevice.Viewport.Width - 59)
            {
                posicao.X = graphicsDevice.Viewport.Width - 59;
            }

            if (posicao.Y >= graphicsDevice.Viewport.Height - 73)
            {
                posicao.Y = graphicsDevice.Viewport.Height - 73;
            }
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            switch (estadoHeroi)
            {
                case EstadoHeroi.PARADO_B:
                    animacaoHeroiParadoBaixo.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ANDANDO_B:
                    animacaoHeroiAndandoBaixo.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ANDANDO_C:
                    animacaoHeroiAndandoCima.Draw(spriteBatch);
                    break;

                case EstadoHeroi.PARADO_C:
                    animacaoHeroiParadoCima.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ANDANDO_D:
                    animacaoHeroiAndandoDireita.Draw(spriteBatch);
                    break;

                case EstadoHeroi.PARADO_D:
                    animacaoHeroiParadoDireita.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ANDANDO_E:
                    animacaoHeroiAndandoEsquerda.Draw(spriteBatch);
                    break;

                case EstadoHeroi.PARADO_E:
                    animacaoHeroiParadoEsquerda.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ATIRANDO_D:
                    animacaoHeroiAtirandoDireita.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ATIRANDO_B:
                    animacaoHeroiAtirandoBaixo.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ATIRANDO_C:
                    animacaoHeroiAtirandoCima.Draw(spriteBatch);
                    break;

                case EstadoHeroi.ATIRANDO_E:
                    animacaoHeroiAtirandoEsquerda.Draw(spriteBatch);
                    break;

                case EstadoHeroi.DANO_B:
                    animacaoHeroiDanoBaixo.Draw(spriteBatch);
                    break;

                case EstadoHeroi.DANO_C:
                    animacaoHeroiDanoCima.Draw(spriteBatch);
                    break;

                case EstadoHeroi.DANO_D:
                    animacaoHeroiDanoDireita.Draw(spriteBatch);
                    break;

                case EstadoHeroi.DANO_E:
                    animacaoHeroiDanoEsquerda.Draw(spriteBatch);
                    break;
            }
        }

        public void Controle(GameTime gameTime)
        {
            

            if (teclado.IsKeyDown(Keys.W) && animacaoHeroiAtirandoCima.ativo == false && pause == false)
            {
                baixo = false;
                direita = false;
                esquerda = false;
                cima = true;

                estadoHeroi = EstadoHeroi.ANDANDO_C;

                if (mover)
                {
                    if (posicao.Y >= 250)
                    {
                        posicao.Y -= velocidadeHeroiY;
                    }
                    else
                    {
                        movimento = true;
                        if (mapa.posicaoInicial.Y > 0)
                        {
                            mapa.posicaoInicial.Y -= velocidadeHeroiY;
                            for (int i = 0; i < listaInimigos.Count; i++)
                            {
                                listaInimigos[i].posicao.Y += velocidadeHeroiY;
                            }
                        }
                    }
                }

                

            }
            if (teclado.IsKeyUp(Keys.W))
            {
                movimento = false;
                
                if (cima && (atirando == false || animacaoHeroiAtirandoCima.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_C;
                    animacaoHeroiAndandoCima.frameAtual = Point.Zero;
                }
            }

            if (teclado.IsKeyDown(Keys.S) && animacaoHeroiAtirandoBaixo.ativo == false && pause == false)
            {
                cima = false;
                direita = false;
                esquerda = false;
                baixo = true;

                estadoHeroi = EstadoHeroi.ANDANDO_B;

                posicao.Y += velocidadeHeroiYm;

            }
            if (teclado.IsKeyUp(Keys.S))
            {
                if (baixo && (atirando == false || animacaoHeroiAtirandoBaixo.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_B;
                    animacaoHeroiAndandoBaixo.frameAtual = Point.Zero;
                }
            }

            if (teclado.IsKeyDown(Keys.A) && animacaoHeroiAtirandoEsquerda.ativo == false && pause == false)
            {
                baixo = false;
                direita = false;
                esquerda = true;
                cima = false;

                estadoHeroi = EstadoHeroi.ANDANDO_E;

                posicao.X -= velocidadeHeroiXm;

                velocidadeHeroiY = 0;
                velocidadeHeroiYm = 0;

            }
            if (teclado.IsKeyUp(Keys.A))
            {
                if (esquerda && (atirando == false || animacaoHeroiAtirandoEsquerda.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_E;
                    animacaoHeroiAndandoEsquerda.frameAtual = Point.Zero;
                }

                if (direita == false)
                {
                    velocidadeHeroiY = 5;
                    velocidadeHeroiYm = 5;
                }
            }

            if (teclado.IsKeyDown(Keys.D) && animacaoHeroiAtirandoDireita.ativo == false && pause == false)
            {
                cima = false;
                direita = true;
                esquerda = false;
                baixo = false;

                velocidadeHeroiY = 0;
                velocidadeHeroiYm = 0;

                estadoHeroi = EstadoHeroi.ANDANDO_D;

                posicao.X += velocidadeHeroiX;

            }
            if (teclado.IsKeyUp(Keys.D))
            {

                if (direita && (atirando == false || animacaoHeroiAtirandoDireita.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_D;
                    animacaoHeroiAndandoDireita.frameAtual = Point.Zero;
                }
            }


            if (teclado.IsKeyDown(Keys.Space) && pause == false)
            {

                if (atirar)
                {
                    if (direita)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_D;
                        animacaoHeroiAtirandoDireita.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoDireita.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(10, 47);
                        velocidadeTiroX = 20;
                        velocidadeTiroY = 0;
                        rotacao = -80;
                    }

                    if (esquerda)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_E;
                        animacaoHeroiAtirandoEsquerda.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoEsquerda.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(30, 47);
                        velocidadeTiroX = -20;
                        velocidadeTiroY = 0;
                        rotacao = 80;
                    }

                    if (cima)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_C;
                        animacaoHeroiAtirandoCima.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoCima.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(47, 50);
                        velocidadeTiroX = 0;
                        velocidadeTiroY = -20;
                        rotacao = 0;
                    }

                    if (baixo)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_B;
                        animacaoHeroiAtirandoBaixo.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoBaixo.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(13, 20);
                        velocidadeTiroX = 0;
                        velocidadeTiroY = 20;
                        rotacao = 3;
                    }

                    if (gameTime.TotalGameTime - ultimoTempoTiro > tempoTiro)
                    {
                        // Reset our current time
                        ultimoTempoTiro = gameTime.TotalGameTime;

                        // Add the projectile, but add it to the front and center of the player
                        AddProjectile(posicao + posicaoTiro);

                        atirar = false;
                    }
                }


            }
            if (teclado.IsKeyUp(Keys.Space))
            {
                atirar = true;
            }
        }

        public void Controle2(GameTime gameTime)
        {
            if (teclado.IsKeyDown(Keys.Up) && animacaoHeroiAtirandoCima.ativo == false)
            {
                baixo = false;
                direita = false;
                esquerda = false;
                cima = true;

                estadoHeroi = EstadoHeroi.ANDANDO_C;

                if (posicao.Y >= 250)
                {
                    posicao.Y -= velocidadeHeroiY;
                }
                else
                {
                    movimento = true;
                    if (mapa.posicaoInicial.Y > 0)
                    {
                        mapa.posicaoInicial.Y -= velocidadeHeroiY;
                        for (int i = 0; i < listaInimigos.Count; i++)
                        {
                            listaInimigos[i].posicao.Y += velocidadeHeroiY;
                        }
                    }
                }

            }
            if (teclado.IsKeyUp(Keys.Up))
            {
                movimento = false;
                if (cima && (atirando == false || animacaoHeroiAtirandoCima.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_C;
                    animacaoHeroiAndandoCima.frameAtual = Point.Zero;
                }
            }

            if (teclado.IsKeyDown(Keys.Down) && animacaoHeroiAtirandoBaixo.ativo == false)
            {
                cima = false;
                direita = false;
                esquerda = false;
                baixo = true;

                estadoHeroi = EstadoHeroi.ANDANDO_B;

                posicao.Y += velocidadeHeroiYm;

            }
            if (teclado.IsKeyUp(Keys.Down))
            {
                if (baixo && (atirando == false || animacaoHeroiAtirandoBaixo.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_B;
                    animacaoHeroiAndandoBaixo.frameAtual = Point.Zero;
                }
            }

            if (teclado.IsKeyDown(Keys.Left) && animacaoHeroiAtirandoEsquerda.ativo == false)
            {
                baixo = false;
                direita = false;
                esquerda = true;
                cima = false;

                estadoHeroi = EstadoHeroi.ANDANDO_E;

                posicao.X -= velocidadeHeroiXm;

                velocidadeHeroiY = 0;
                velocidadeHeroiYm = 0;

            }
            if (teclado.IsKeyUp(Keys.Left))
            {
                if (esquerda && (atirando == false || animacaoHeroiAtirandoEsquerda.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_E;
                    animacaoHeroiAndandoEsquerda.frameAtual = Point.Zero;
                }

                if (direita == false)
                {
                    velocidadeHeroiY = 5;
                    velocidadeHeroiYm = 5;
                }
            }

            if (teclado.IsKeyDown(Keys.Right) && animacaoHeroiAtirandoDireita.ativo == false)
            {
                cima = false;
                direita = true;
                esquerda = false;
                baixo = false;

                velocidadeHeroiY = 0;
                velocidadeHeroiYm = 0;

                estadoHeroi = EstadoHeroi.ANDANDO_D;

                posicao.X += velocidadeHeroiX;

            }
            if (teclado.IsKeyUp(Keys.Right))
            {

                if (direita && (atirando == false || animacaoHeroiAtirandoDireita.ativo == false) && atingido == false)
                {
                    estadoHeroi = EstadoHeroi.PARADO_D;
                    animacaoHeroiAndandoDireita.frameAtual = Point.Zero;
                }
            }


            if (teclado.IsKeyDown(Keys.NumPad0))
            {

                if (atirar)
                {
                    if (direita)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_D;
                        animacaoHeroiAtirandoDireita.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoDireita.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(10, 47);
                        velocidadeTiroX = 20;
                        velocidadeTiroY = 0;
                        rotacao = -80;
                    }

                    if (esquerda)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_E;
                        animacaoHeroiAtirandoEsquerda.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoEsquerda.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(30, 47);
                        velocidadeTiroX = -20;
                        velocidadeTiroY = 0;
                        rotacao = 80;
                    }

                    if (cima)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_C;
                        animacaoHeroiAtirandoCima.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoCima.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(47, 50);
                        velocidadeTiroX = 0;
                        velocidadeTiroY = -20;
                        rotacao = 0;
                    }

                    if (baixo)
                    {
                        estadoHeroi = EstadoHeroi.ATIRANDO_B;
                        animacaoHeroiAtirandoBaixo.ativo = true;
                        atirando = true;

                        if (animacaoHeroiAtirandoBaixo.ativo == false)
                        {
                            atirando = false;
                        }

                        posicaoTiro = new Vector2(13, 20);
                        velocidadeTiroX = 0;
                        velocidadeTiroY = 20;
                        rotacao = 3;
                    }

                    if (gameTime.TotalGameTime - ultimoTempoTiro > tempoTiro)
                    {
                        // Reset our current time
                        ultimoTempoTiro = gameTime.TotalGameTime;

                        // Add the projectile, but add it to the front and center of the player
                        AddProjectile(posicao + posicaoTiro);

                        atirar = false;
                    }
                }


            }
            if (teclado.IsKeyUp(Keys.P))
            {
                atirar = true;
            }
        }

        public void RetanguloHeroi()
        {

            if (cima)
            {
                posicaoRetangulo = new Point(14, 22);
                tamanhoRetangulo = new Point(30, 40);
            }

            if (baixo)
            {
                posicaoRetangulo = new Point(20, 22);
                tamanhoRetangulo = new Point(30, 40);
            }

            if (direita)
            {
                posicaoRetangulo = new Point(12, 22);
                tamanhoRetangulo = new Point(30, 40);
            }

            if (esquerda)
            {
                posicaoRetangulo = new Point(16, 22);
                tamanhoRetangulo = new Point(30, 40);
            }

            retangulo = new Rectangle((int)posicao.X + posicaoRetangulo.X, (int)posicao.Y + posicaoRetangulo.Y, tamanhoRetangulo.X, tamanhoRetangulo.Y);
        }

        public void AddProjectile(Vector2 position)
        {
            tiros.Add(new Tiro(graphicsDevice.Viewport, texturaTiro, position, velocidadeTiroX, velocidadeTiroY, rotacao));
        }

        public void UpdateTiros()
        {
            // Update the Projectiles

            for (int i = tiros.Count - 1; i >= 0; i--)
            {
                tiros[i].Update();

                if (tiros[i].ativo == false)
                {
                    tiros.RemoveAt(i);
                }
            }
        }
    }
}
